/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.dp1.pucp.Logistica.Controlador;

import com.dp1.pucp.Logistica.DAO.*;

import com.dp1.pucp.Logistica.Vista.ProcesarPedidoProdNextGUI;
import com.dp1.pucp.Modelo.Clases.Lineapedidocompra;
import com.dp1.pucp.Modelo.Clases.Materiaprima;
import com.dp1.pucp.Modelo.Clases.Moneda;
import com.dp1.pucp.Modelo.Clases.Pedidocompra;
import com.dp1.pucp.Modelo.Clases.Tipoproducto;
import com.dp1.pucp.Modelo.Clases.RecetaPfMp;
import com.dp1.pucp.Modelo.Clases.Simulacion;
import com.dp1.pucp.Util.Validaciones;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.Date;
import javax.swing.table.TableModel;

/**
 *
 * @author ubuntu64
 */
public class ProcesarPedidosNextControlador {
    
    ProcesarPedidoProdNextGUI vista;
    ProcesarPedidosDAO dao;
    ProcesarPedidosControlador cont;
    TipoProductoDAO m;
    ArrayList<Tipoproducto> insumos ;
    String[] unidades;
    float [] cantidadRequerida;
    float [] cantidadAlmacen;
    float [] cantidadFaltante;
    public ProcesarPedidosNextControlador (ProcesarPedidoProdNextGUI vista, ProcesarPedidosDAO dao, ProcesarPedidosControlador c){
        
        this.dao = dao;
        this.vista= vista;
        this.cont  = c;
        
        vista.addCalcularListener(new ProcesarPedidosNextControlador.calcularListener());
        vista.addCancelarListener(new ProcesarPedidosNextControlador.cancelarListener());
        vista.addGenerarCompra(new ProcesarPedidosNextControlador.generarListener());
    }
    
    class calcularListener implements ActionListener {
        @Override
        public void actionPerformed(ActionEvent e){
            int cantidad1 = cont.vista.getCantidad1();
            int cantidad2 = cont.vista.getCantidad2();
            int cantidad3 = cont.vista.getCantidad3();

            ArrayList<RecetaPfMp> receta1 = dao.getReceta(1);
            ArrayList<RecetaPfMp> receta2 = dao.getReceta(2);
            ArrayList<RecetaPfMp> receta3 = dao.getReceta(3);
            //calcular materia prima requerida para cada una
            
            insumos = dao.getInsumos();
            cantidadRequerida = new float[insumos.size()];
            cantidadAlmacen = new float[insumos.size()];
            cantidadFaltante = new float[insumos.size()];
            unidades = new String[insumos.size()];
            
            for (int i=0; i<insumos.size(); i++){
                
                for (int j=0; j<receta1.size();j++){
                    if (receta1.get(j).getTipoproductoByIdtipoproductoMp().getIdtipoproducto()==insumos.get(i).getIdtipoproducto()){
                       cantidadRequerida[i]=receta1.get(j).getCantidad()*cantidad1;
                    }
                }
                
                for (int j=0; j<receta2.size();j++){
                    if (receta2.get(j).getTipoproductoByIdtipoproductoMp().getIdtipoproducto()==insumos.get(i).getIdtipoproducto()){
                       cantidadRequerida[i]+=receta2.get(j).getCantidad()*cantidad2;
                    }
                }
                
                for (int j=0; j<receta3.size();j++){
                    if (receta3.get(j).getTipoproductoByIdtipoproductoMp().getIdtipoproducto()==insumos.get(i).getIdtipoproducto()){
                       cantidadRequerida[i]+=receta3.get(j).getCantidad()*cantidad3;
                    }
                }
            }//FIN DEL FOR GRANDE
            
            ArrayList<Materiaprima> materias = dao.getMateriasPrimas();
            
            for (int i=0; i<insumos.size(); i++){
                for (int j=0; j<materias.size(); j++){
                    if (materias.get(j).getTipoproducto().getIdtipoproducto()==insumos.get(i).getIdtipoproducto()){
                        cantidadAlmacen[i]=materias.get(j).getCantidad();
                    }
                }
            }
            
            for (int i=0; i<insumos.size(); i++){
                float falta = cantidadRequerida[i]-cantidadAlmacen[i];
                if (falta>0){
                    cantidadFaltante[i] = falta; 
                }
                else {
                    cantidadFaltante[i] = 0;
                }
            }
            
            for (int i=0; i<insumos.size(); i++){
                unidades[i] = insumos.get(i).getUnidades();
            }
            
            vista.mostrarTabla(insumos, cantidadRequerida, cantidadAlmacen, cantidadFaltante, unidades);
        } // fin actionPerformed
    }
    
    class cancelarListener implements ActionListener {
        @Override
        public void actionPerformed(ActionEvent e){
            
        }
    }
    
    class generarListener implements ActionListener {
        @Override
        public void actionPerformed(ActionEvent e){
            //Generar Ordenes de Compra
            
            Pedidocompra pedidoNuevo=new Pedidocompra();
            Pedidocompra pedidoC=new Pedidocompra();
            //agrego el pedido
            Date fecha=new Date();
            //saco el ultimo pedido compra
            
            
            String codigo="";
            //Pedidocompra pedido =null;
            try {
                pedidoC= dao.sacarUltPedido();
                
                
                
            } catch (Exception ex) {
                ex.printStackTrace();
            }
        
         if (pedidoC.getIdpedidocompra()==0) {
             pedidoC = new Pedidocompra();
             pedidoC.setCodigo("PED00000001");
             //pedido= m.sacarUltCodPedido();
             
             codigo=pedidoC.getCodigo();
         }
         else{
       codigo=pedidoC.getCodigo();
        //aca saca el codigo mas grande  PED00000001

       // if (pedido.getCodigo()==null{
        //  LineaCompraView.llenaCodigo("PED00000001");}

            String ceros="";
            //Genero Codigo Siguiente
            String ped= codigo.substring(0, 3);
            String num=codigo.substring(3, 11);
            int longC=num.length(); //aca siempre es 8

            int numero=Integer.parseInt(num);
            numero++;

            String nume=String.valueOf(numero);
            //saco longitud de ese entero en caracteres
            int longE=nume.length();

            for(int i=1;i<(longC-longE+1);i++){
                ceros=ceros+'0';
            }

            codigo= ped+""+ceros+""+numero;
            
        }
        
        
            
            
            
            
            
        pedidoNuevo.setFechasolicitud(fecha);
        pedidoNuevo.setCodigo(codigo);
        pedidoNuevo.setEstado(1);
        pedidoNuevo.setMotivo("Pedido Cliente");
        
        Pedidocompra ultimo = dao.guardarPedido(pedidoNuevo);
       
          
          
        //ahora guardo las lineas
      
            Moneda moneda=new Moneda();
            for(int i=0;i<insumos.size();i++){
                moneda.setIdmoneda(1);
                
                Lineapedidocompra linea=new Lineapedidocompra();
                
                            
                linea.setPedidocompra(ultimo);
                linea.setMoneda(moneda);
                int cant = (int)Math.ceil(cantidadFaltante[i]);
               // linea.setCantidad(cantidadFaltante[i]);
                linea.setCantidad((float)cant);
                linea.setTipoproducto(insumos.get(i));
                dao.guardarLineaPedido(linea);
               
            }
            Validaciones.mostrarMensajeAvisoVal("Las ordenes de compra de los productos han sido generadas.Debe esperar a que se gestione su compra");
            
             ArrayList<Simulacion> simulaciones = dao.getSimulacionesActivas();     for (int i=0; i<simulaciones.size(); i++){
                 simulaciones.get(i).setEstado(8);
                 simulaciones.get(i).setPedidocompra(ultimo);
                 dao.guardarSimulacion(simulaciones.get(i));
             }
            vista.dispose();
            cont.vista.inhabilitarCalcular();
            cont.vista.inhabilitarSiguiente();
            
        } // fin del actionPerformed
      }

}
